package script.esx;

import cn.com.betasoft.dsat.probe.groovy.SimException;
/**
 * 样例：同redhat的取值方式
原生变量：g_col_pars g_col_other g_rets
原生变量：g_res(g_shc, g_dbcon)
返回的数据：返回数组[]
[unionmon@linux_server unionmon]$ netstat -i 1 1
Kernel Interface table
Iface     MTU Met   RX-OK RX-ERR RX-DRP RX-OVR   TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0  231807      0      0      0   16978      0      0      0 BMRU
lo        16436   0      10      0      0      0      10      0      0      0 LRU
 ◆ 显示接口特性

在随- i标记一起调用时， netstat将显示网络接口的当前配置特性。除此以外，如果调用时还带上-a选项，它还将输出内核中所有接口，并不只是当前配置的接口。netstat-i的输出结果是这样的：

[root@localhost ~]# netstat -ai
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0 1750856471     17    104      0 52415001      0      0      0 BMRU
lo        16436   0   406804      0      0      0   406804      0      0      0 LRU
sit0       1480   0        0      0      0      0        0      0      0      0 O

MTU和Met字段表示的是接口的MTU和度量值值；RX和TX这两列表示的是已经准确无误地收发了多少数据包（ RX - OK / TX - OK）、
产生了多少错误（ RX-ERR/TX-ERR）、丢弃了多少包（RX-DRP/TX-DRP），由于误差而遗失了多少包（RX-OVR/TX-OVR）；
最后一列展示的是为这个接口设置的标记，在利用ifconfig显示接口配置时，这些标记都采用一个字母。它们的说明如下：

■ B 已经设置了一个广播地址。
■ L 该接口是一个回送设备。
■ M 接收所有数据包（混乱模式）。
■ N 避免跟踪。
■ O 在该接口上，禁用A R P。
■ P 这是一个点到点链接。
■ R 接口正在运行。
■ U 接口处于“活动”状态。

*/
def json = [];
//获取数据
def String ret = g_shc.collect('''netstat -ai''');
if(ret.contains("command not found")){
	throw new SimException(8001,"ESX.NetworkCardInfo:没有找到命令.");
}
if(ret.contains("Permission denied")){
	throw new SimException(8002,"ESX.NetworkCardInfo:没有权限执行命令.");
}
def matched = false;
ret.split("\n").each{ line ->
	if (line ==~ /\S+\s+(\d+\s+){10}\S+/){
		matched = true;
		def fields = line.split(/\s+/);
		def netstat =['Name':'','Status':'','Type':''];
		netstat['Name'] = fields[1];
		netstat['Status'] =fields[11];
		if (netstat['Status'].contains("R")){
			netstat['Status'] = "Up";
		}else{
			if (netstat['Status'].contains("U")){
				netstat['Status'] = "LinkDown";
			}else{
				netstat['Status'] = "Down";
			}
		}
		json.add(netstat);
	}
};
if(!matched){
	throw new SimException(8003,"ESX.NetworkCardInfo:返回数据不匹配.");
}
//序列化返回
g_rets = json;